/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._115_;

//%I+ <124
//import cz.pecinovsky.english.lootp.manager.chozí.IPaintable;
//%I-
import cz.pecinovsky.english.lootp._parents._IArrow_120_124;
import cz.pecinovsky.english.lootp.manager.IMoveable;
import cz.pecinovsky.english.lootp.manager.Painter;
import cz.pecinovsky.english.lootp.manager.Rectangle;
import cz.pecinovsky.english.lootp.manager.Triangle;

import cz.pecinovsky.english.lootp.utility.Position;

import cz.pecinovsky.english.lootp.utility.NamedColor;
import cz.pecinovsky.english.lootp.utility.Direction8;



//import cz.pecinovsky.english.lootp._115_.Arrow_120_124.Arrow;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++

//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Previous:  {@link cz.pecinovsky.english.lootp._115_.Arrow_116_119}
 * Following: {@link cz.pecinovsky.english.lootp._115_.Arrow_125_133}
 *
 * Projekt  020z - Comments
 *   + Začlenění do standardní šablony + Komentáře
 *
 * Projekt  021z - Použití this
 *   ~ V prvních dvou konstruktorech nahrazena původní těla
 *     příkazem this volajícím obecnější konstruktor
 *
 * Projekt  022z - Přetěžování
 *   + Přidány další dva konstruktory
 *   ~ Ve třetím konstruktoru nahrazeno body příkazem this
 *     volající přidaný obecnější konstruktor
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class Arrow_120_124
{    private Arrow_120_124() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Instance třídy {@code Arrow} představují šipky natočené na východ.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
//%I+ <124
//public class Arrow implements IPaintable
//%I-
//%A+ >124
public class Arrow implements IMoveable
//%A-
//%A+ <0
        ,   _IArrow_120_124
//%A-
{
//== CONSTANT CLASS ATTRIBUTES =================================================
//== VARIABLE CLASS ATTRIBUTES =================================================
//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ========
//== CONSTANT INSTANCE ATTRIBUTES ==============================================

    /** Obdélníková část představující body šipky. */
    private Rectangle body;

    /** Trojúhelníkové zakončení šipky. */
    private Triangle head;

    /** NamedColor celé šipky, tj. těla i hlavy. */
    private NamedColor color;



//== VARIABLE INSTANCE ATTRIBUTES ==============================================
//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Vytvoří šipku implicitních rozměrů a barvy
     * umístěnou v levém horním rohu plátna.
     */
    public Arrow()
    {
//%I+ <121
//        color = NamedColor.BLACK;
//        body  = new Rectangle( 0, 15, 25, 20, color);
//        head  = new Triangle (25,  0, 25, 50, color, Direction8.EAST);
//%I-
//%A+ >121
         this(0, 0);
//%A-
    }


    /***************************************************************************
     * Vytvoří šipku implicitních rozměrů a barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
     */
    public Arrow(int x, int y)
    {
//%I+ <121
//        color = NamedColor.BLACK;
//        body  = new Rectangle(x,    y+15, 25, 20, color);
//        head  = new Triangle (x+25, y,    25, 50, color, Direction8.EAST);
//%I-
//%A+ >121
        this(x, y, NamedColor.BLACK);
//%A-
    }


    /***************************************************************************
     * Vytvoří šipku implicitních rozměrů zadané barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
//%I+ <121
//     * @param b  Počáteční color vytvářené šipky
//%I-
//%A+ >121
     * @param color  Počáteční color vytvářené šipky
//%A-
     */
//%I+ <121
//    public Arrow(int x, int y, NamedColor b)
//    {
//        color = b;
//        body  = new Rectangle(x,    y+15, 25, 20, color);
//        head  = new Triangle (x+25, y,    25, 50, color, Direction8.EAST);
//    }
//%I-
//%A+ >121
    public Arrow(int x, int y, NamedColor color)
    {
//%A-
//%I+ =121z
//        this.color = color;
//        this.body  = new Rectangle(x,    y+15, 25, 20, color);
//        this.head  = new Triangle (x+25, y,    25, 50, color, Direction8.EAST);
//    }
//%I-
//%A+ >122
        this(x, y, 50, color);
    }


    /***************************************************************************
     * Vytvoří šipku zadaných rozměrů a implicitní barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
     * @param module Průměr vytvárené šipky
     */
    public Arrow(int x, int y, int module)
    {
        this(x, y, module, NamedColor.BLACK);
    }


    /***************************************************************************
     * Vytvoří šipku zadaných rozměrů a implicitní barvy
     * umístěnou na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářené šipky
     * @param y  Svislá souřadnice vytvářené šipky
     * @param module Průměr vytvárené šipky
     * @param color  NamedColor šipky
     */
    public Arrow(int x, int y, int module, NamedColor color)
    {
//%A-
//%I+ =122z
//        this.body  = new Rectangle(x,         y+module/3,
//                                   module/2,   module/3, color);
//        this.head = new Triangle  (x+module/2, y,
//                                   module/2,   module,   color, Direction8.EAST);
//%I-
//%A+ >123
        int m2 = module / 2;
        int m3 = module / 3;

        this.body  = new Rectangle(x,    y+m3, m2, m3,   color);
        this.head = new Triangle  (x+m2, y,    m2, module,color, Direction8.EAST);
//%A-
//%A+ >122
        this.color   = color;
    }
//%A-



//== ABSTRACT METHODS ==========================================================
//== INSTANCE GETTERS AND SETTERS ==============================================

    /***************************************************************************
     * Nastaví novou barvu šipky; nadále si však pamatuje její výchozí barvu.
     *
     * @param color Zadávaná nová color
     */
//%A+ <0
        @Override
//%A-
    public void setColor(NamedColor color)
    {
        body.setColor(color);
        head.setColor(color);
    }

//%A+ >124

    // Sada přístupových metod vlastnosti: Position ******************************

    /***************************************************************************
     * Vrátí x-ovou (vodorovnou) souřadnici pozice instance.
     *
     * @return  x-ová souřadnice.
     */
    @Override
    public int getX()
    {
        return body.getX();
    }


    /***************************************************************************
     * Vrátí y-ovou (svislou) souřadnici pozice instance.
     *
     * @return  y-ová souřadnice.
     */
    @Override
    public int getY()
    {
        return head.getY();
    }

//%A-
//%A+ >125

    /***************************************************************************
     * Vrátí přepravku se svojí aktuální pozicí.
     *
     * @return Aktuální pozice šipky
     */
    @Override
    public Position getPosition()
    {
        return new Position(getX(), getY());
    }


    /***************************************************************************
     * Nastaví novou pozici šipky.
     *
     * @param p Nastavovaná pozice
     */
    @Override
    public void setPosition(Position p)
    {
        this.setPosition(p.x, p.y);
    }

//%A-
//%A+ >123

    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
//%A-
//%A+ >124
    @Override
//%A-
//%A+ >123
    public void setPosition(int x, int y)
    {
        int m  = head.getHeight();
        int m2 = m / 2;
        int m3 = m / 3;

        body .setPosition(x,    y+m3);
        head.setPosition(x+m2, y);
    }

//%A-
//%A+ >124

    // Sada přístupových metod vlastnosti: Rozměr / Modul **********************

    /***************************************************************************
     * Vrátí základní délku, od níž se odvozují všechny rozměry objektu -
     * pro šipku je to její délka, které je současně šířkou základny hlavy.
     *
     * @return Délka a šířka šipky
     */
//%A-
//%A+ <0
        @Override
//%A-
//%A+ >124
    public int getModule()
    {
        return head.getHeight();
    }

//%A-
//%A+ >123

    /***************************************************************************
     * Nastaví nový module = "čtvercový" rozměr instance;
     * na zadaný rozměr se nastaví její výška i šířka.
     *
     * @param module  Nově nastavovaný rozměr v obou směrech; rozměr>0
     */
//%A-
//%A+ <0
        @Override
//%A-
//%A+ >123
    public void setModule(int module)
    {
        int x  = body.getX();
        int y  = head.getY();
        int m  = module;
        int m2 = m / 2;
        int m3 = m / 3;

        body .setPosition(x,    y+m3);
        head.setPosition(x+m2, y);

        body .setSize(m2, m3);
        head.setSize(m2, m);
    }

//%A-


//== OTHER NON-PRIVATE INSTANCE METHODS ========================================

    /***************************************************************************
     * Zprůsvitní šipku, tj. nastaví jí průsvitnější barvu.
     */
//%A+ <0
        @Override
//%A-
    public void translucent()
    {
        body.setColor(color.translucent());
        head.setColor(color.translucent());
    }


    /***************************************************************************
     * Vrátí šipce její výchozí barvu.
     */
//%A+ <0
        @Override
//%A-
    public void restoreColor()
    {
        setColor(color);
    }


    /***************************************************************************
     * Paint the instance by force the specified painter.
     *
     * @param painter Painter drawing the instance
     */
    @Override
    public void paint(Painter painter)
    {
        body.paint(painter);
        head.paint(painter);
    }



//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        Arrow inst = new Arrow();
//    }
//    /** @param args Command line arguments - they are not used. */
//    public static void main(String[] args)  {  test();  }
    }

//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        System.exit(0);
//    }
//    /** @param args Command line arguments - they are not used. */
//    public static void main(String[] args)  {  test();  }
}
